基于 TensorFlow 的第一个神经网络
代码参考《TensorFlow:实战Google深度学习框架》,本地手打,调试后复制出来,和原文会有差别。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
from numpy.random import RandomState
batch_size=8
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
x=tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_=tf.placeholder(tf.float32,shape=(None,1),name="y-input")
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
rdm=RandomState(1)
dataset_size=128
X=rdm.rand(dataset_size,2)
print X
Y=[[int(x1+x2<1)] for (x1,x2) in X]
print Y
with tf.Session() as sess:
init_op=tf.initialize_all_variables()
sess.run(init_op)
print sess.run(w1)
print sess.run(w2)
STEPS=5000
for i in range(STEPS):
start=(i*batch_size)%dataset_size
end=min(start+batch_size,dataset_size)
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
if(i%1000==0):
total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("After %d training step,cross entrypy on all data is %g"%(i,total_cross_entropy))
print sess.run(w1)
print sess.run(w2)
基于 TensorFlow 的第一个神经网络,可以看到 w1,w2 对应的变化。
输出:
[[-0.81131822 1.48459876 0.06532937]
[-2.44270396 0.0992484 0.59122431]]
[[-0.81131822]
[ 1.48459876]
[ 0.06532937]]
After 0 training step,cross entrypy on all data is 0.0674925
After 1000 training step,cross entrypy on all data is 0.0163385
After 2000 training step,cross entrypy on all data is 0.00907547
After 3000 training step,cross entrypy on all data is 0.00714436
After 4000 training step,cross entrypy on all data is 0.00578471
[[-1.9618274 2.58235407 1.68203783]
[-3.4681716 1.06982327 2.11788988]]
[[-1.8247149 ]
[ 2.68546653]
[ 1.41819501]]